<?php
/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Filter
 * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 * @version    $Id: StringToLower.php 23775 2011-03-01 17:25:24Z ralph $
 */

/**
 * @see Zend_Filter_Interface
 */
require_once 'Zend/Filter/Interface.php';

/**
 * @category   Zend
 * @package    Zend_Filter
 * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class Zend_Filter_StringToLower implements Zend_Filter_Interface {
	/**
	 * Encoding for the input string
	 *
	 * @var string
	 */
	protected $_encoding = null;
	
	/**
	 * Constructor
	 *
	 * @param string|array|Zend_Config $options OPTIONAL
	 */
	public function __construct($options = null) {
		if ($options instanceof Zend_Config) {
			$options = $options->toArray ();
		} else if (! is_array ( $options )) {
			$options = func_get_args ();
			$temp = array ();
			if (! empty ( $options )) {
				$temp ['encoding'] = array_shift ( $options );
			}
			$options = $temp;
		}
		
		if (! array_key_exists ( 'encoding', $options ) && function_exists ( 'mb_internal_encoding' )) {
			$options ['encoding'] = mb_internal_encoding ();
		}
		
		if (array_key_exists ( 'encoding', $options )) {
			$this->setEncoding ( $options ['encoding'] );
		}
	}
	
	/**
	 * Returns the set encoding
	 *
	 * @return string
	 */
	public function getEncoding() {
		return $this->_encoding;
	}
	
	/**
	 * Set the input encoding for the given string
	 *
	 * @param  string $encoding
	 * @return Zend_Filter_StringToLower Provides a fluent interface
	 * @throws Zend_Filter_Exception
	 */
	public function setEncoding($encoding = null) {
		if ($encoding !== null) {
			if (! function_exists ( 'mb_strtolower' )) {
				require_once 'Zend/Filter/Exception.php';
				throw new Zend_Filter_Exception ( 'mbstring is required for this feature' );
			}
			
			$encoding = ( string ) $encoding;
			if (! in_array ( strtolower ( $encoding ), array_map ( 'strtolower', mb_list_encodings () ) )) {
				require_once 'Zend/Filter/Exception.php';
				throw new Zend_Filter_Exception ( "The given encoding '$encoding' is not supported by mbstring" );
			}
		}
		
		$this->_encoding = $encoding;
		return $this;
	}
	
	/**
	 * Defined by Zend_Filter_Interface
	 *
	 * Returns the string $value, converting characters to lowercase as necessary
	 *
	 * @param  string $value
	 * @return string
	 */
	public function filter($value) {
		if ($this->_encoding !== null) {
			return mb_strtolower ( ( string ) $value, $this->_encoding );
		}
		
		return strtolower ( ( string ) $value );
	}
}
